﻿using QuanLyThuVien.BLL;
using QuanLyThuVien.DTO;
using QuanLyThuVien.Supporter;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace QuanLyThuVien.GUI
{
    public partial class GUIPhieuTra : DevComponents.DotNetBar.Office2007Form
    {
        private BLLDocGia _bllDocGia;
        private BLLCuonSach _bllCuonSach;
        private BLLPhieuMuon _bllPhieuMuon;
        private BLLPhieuTra _bllPhieuTra;
        private BLLCT_PhieuTra _bllCT_PhieuTra;
        private BLLQuyDinh _bllQuyDinh;

        private DTOPhieuTra _PhieuTra;
        private List<DTOCT_PhieuMuon> _DSSachDangMuon;
        private THAOTAC _ThaoTac;

        //----------------------------------------------------------------------
        //Desc: constructor mặc định
        //----------------------------------------------------------------------
        public GUIPhieuTra()
        {
            InitializeComponent();

            KhoiTao();
            _ThaoTac = THAOTAC.XEM;
            _PhieuTra = new DTOPhieuTra();
        }

        //----------------------------------------------------------------------
        //Desc: constructor 1 tham số
        //----------------------------------------------------------------------
        public GUIPhieuTra(THAOTAC thaotac)
        {
            InitializeComponent();

            KhoiTao();
            _ThaoTac = thaotac;
            _PhieuTra = new DTOPhieuTra();
        }

        //----------------------------------------------------------------------
        //Desc: constructor 2 tham số
        //----------------------------------------------------------------------
        public GUIPhieuTra(THAOTAC thaotac, DTOPhieuTra phieutra)
        {
            InitializeComponent();

            KhoiTao();
            _ThaoTac = thaotac;
            _PhieuTra = phieutra;
        }

        //----------------------------------------------------------------------
        //Desc: khởi tạo
        //----------------------------------------------------------------------
        public void KhoiTao()
        {
            _bllDocGia = new BLLDocGia();
            _bllCuonSach = new BLLCuonSach();
            _bllPhieuMuon = new BLLPhieuMuon();
            _bllPhieuTra = new BLLPhieuTra();
            _bllCT_PhieuTra = new BLLCT_PhieuTra();
            _bllQuyDinh = new BLLQuyDinh();

            _DSSachDangMuon = new List<DTOCT_PhieuMuon>();
        }

        //----------------------------------------------------------------------
        //Desc: cập nhật giao diện
        //----------------------------------------------------------------------
        public void CapNhatGiaoDien()
        {
            switch (_ThaoTac)
            { 
                case THAOTAC.THEM:
                    this.Text = "LẬP PHIẾU TRẢ SÁCH";
                    _btnThemMoi.Visible = true;
                    _btnThemDS.Visible = true;
                    _btnLapPhieuTra.Visible = true;
                    //_btnSua.Visible = false;

                    _txtMaDG.ReadOnly = false;
                    _txtTienThuKyNay.ReadOnly = false;
                    _lblMaSach.Visible = true;
                    _txtMaSach.Visible = true;
                    break;
                case THAOTAC.SUA:
                    this.Text = "THÔNG TIN PHIẾU TRẢ SÁCH";
                    _btnThemMoi.Visible = true;
                    _btnThemDS.Visible = false;
                    _btnLapPhieuTra.Visible = false;
                    //_btnSua.Visible = true;

                    _txtMaDG.ReadOnly = true;
                    _txtTienThuKyNay.ReadOnly = false;
                    _lblMaSach.Visible = false;
                    _txtMaSach.Visible = false;
                    break;
                case THAOTAC.XEM:
                    this.Text = "THÔNG TIN PHIẾU TRẢ SÁCH";
                    _btnThemMoi.Visible = false;
                    _btnThemDS.Visible = false;
                    _btnLapPhieuTra.Visible = false;
                    //_btnSua.Visible = false;

                    _txtMaDG.ReadOnly = true;
                    _txtTienThuKyNay.ReadOnly = true;
                    _lblMaSach.Visible = false;
                    _txtMaSach.Visible = false;
                    break;
            }
        }

        //----------------------------------------------------------------------
        //Desc: cập nhật nội dung
        //----------------------------------------------------------------------
        public void CapNhatNoiDung()
        {
            switch (_ThaoTac)
            { 
                case THAOTAC.THEM:
                    _dtNgayTra.Value = DateTime.Today;
                    _PhieuTra.NgayTra = DateTime.Today;
                    break;
                default:
                    HienThiThongTinPhieuTra();
                    break;
            }
        }

        //----------------------------------------------------------------------
        //Desc: hiển thị thông tin phiếu trar
        //----------------------------------------------------------------------
        public void HienThiThongTinPhieuTra()
        {
            _txtMaDG.Text = _PhieuTra.DocGia.MaDG;
            _txtHoTen.Text = _PhieuTra.DocGia.HoTen;
            _dtNgayTra.Value = _PhieuTra.NgayTra;
            _txtTongNo.Text = _PhieuTra.TongTienPhat.ToString();
            _txtTienThuKyNay.Text = _PhieuTra.TienThuKyNay.ToString();
            _txtNoKyNay.Text = _PhieuTra.ConLai.ToString();
            foreach (DTOCT_PhieuTra ctptr in _PhieuTra.DSCTPhieuTra)
            {
                try
                {
                    _dgwDSSach.Rows.Add(ctptr.CTPhieuMuon.MaCuonSach, _PhieuTra.NgayTra.AddDays(-ctptr.SoNgayMuon).ToString(),
                        ctptr.SoNgayMuon.ToString(), ctptr.TienPhat);
                }
                catch { }
            }
        }

        //----------------------------------------------------------------------
        //Desc: kiểm tra trùng mã sách
        //----------------------------------------------------------------------
        public bool KiemTraTrungMaSach(string macuonsach)
        {
            for (int i = 0; i < _PhieuTra.DSCTPhieuTra.Count; i++)
                if (macuonsach == _PhieuTra.DSCTPhieuTra[i].CTPhieuMuon.MaCuonSach)
                    return true;
            return false;
        }

        //----------------------------------------------------------------------
        //Desc: kiểm tra sách có phải là sách mượn chưa trả
        //----------------------------------------------------------------------
        public bool KiemTraSachMuonChuaTra(string macuonsach)
        {
            for (int i = 0; i < _DSSachDangMuon.Count; i++)
                if (macuonsach == _DSSachDangMuon[i].MaCuonSach)
                    return true;
            return false;
        }

        //----------------------------------------------------------------------
        //Desc: lấy dữ liệu
        //----------------------------------------------------------------------
        public DTOCT_PhieuTra LayDuLieuForm()
        {
            if (_txtMaDG.Text == "")
            {
                MessageBox.Show("Chưa nhập mã độc giả");
                return null;
            }


            if (_txtMaSach.Text == "")
            {
                MessageBox.Show("Chưa nhập mã sách");
                return null;
            }


            if (KiemTraTrungMaSach(_txtMaSach.Text))
            {
                MessageBox.Show("Mã sách đã tồn tại trong danh sách");
                return null;
            }


            DTOCuonSach cuonsach = _bllCuonSach.LayThongTinCuonSach(_txtMaSach.Text);
            if (cuonsach == null)
            {
                MessageBox.Show("Mã sách không tồn tại");
                return null;
            }


            //kiểm tra tình trạng sách
            if (cuonsach.TinhTrang == true)
            {
                MessageBox.Show("Sách này không có độc giả mượn");
                return null;
            }


            if (!KiemTraSachMuonChuaTra(cuonsach.MaCuonSach))
            {
                MessageBox.Show("Độc giả không mượn sách này");
                return null;
            }


            string maphieumuon = "";
            for (int i = 0; i < _DSSachDangMuon.Count; i++)
            {
                if (cuonsach.MaCuonSach == _DSSachDangMuon[i].MaCuonSach)
                {
                    maphieumuon = _DSSachDangMuon[i].MaPhieuMuon;
                    break;
                }
            }


            DateTime ngaymuon = new DateTime();
            object obj = _bllPhieuMuon.LayNgayMuon(maphieumuon);
            if (obj == null)
            {
                MessageBox.Show("Không lấy được ngày mượn");
                return null;
            }
            else
            {
                try
                {
                    ngaymuon = (DateTime)obj;
                }
                catch
                {
                    MessageBox.Show("Sai dữ liệu ngày mượn");
                    return null;
                }

                TimeSpan timespan;
                try
                {
                    timespan = _PhieuTra.NgayTra.Subtract(ngaymuon);
                }
                catch
                {
                    MessageBox.Show("Không tính được số ngày mượn");
                    return null;
                }

                int songaymuon = (int)timespan.TotalDays;
                double tienphatmoingay = _bllQuyDinh.LayTienPhatMoiNgay();
                if (tienphatmoingay < 0)
                {
                    MessageBox.Show("Không lấy được quy định số tiền phạt mỗi ngày");
                    return null;
                }

                int songaymuontd = _bllQuyDinh.LaySoNgayMuonTD();
                if (songaymuontd < 0)
                {
                    MessageBox.Show("Không lấy được số ngày mượn tối đa");
                    return null;
                }

                double tienphat;
                if (songaymuon < songaymuontd)
                    tienphat = 0.0F;
                else
                    tienphat = (songaymuon - songaymuontd) * tienphatmoingay;

                DTOCT_PhieuTra ctptr = new DTOCT_PhieuTra();
                ctptr.CTPhieuMuon = new DTOCT_PhieuMuon(maphieumuon, cuonsach.MaCuonSach);
                ctptr.SoNgayMuon = songaymuon;
                ctptr.TienPhat = tienphat;
                try
                {
                    _dgwDSSach.Rows.Add(cuonsach.MaCuonSach, ngaymuon.ToString("dd/MM/yyyy"), songaymuon.ToString(), tienphat.ToString());
                }
                catch
                {
                    MessageBox.Show("Không hiển thị lên data grid view được");
                    return null;
                }

                return ctptr;
            }
        }

        //----------------------------------------------------------------------
        //Desc: xóa tất cả thông tin hiển thị
        //----------------------------------------------------------------------
        public void XoaTatCa()
        {
            _PhieuTra.Reset();
            _DSSachDangMuon.Clear();

            _txtMaDG.Text = "";
            _txtHoTen.Text = "";
            _txtTongNo.Text = "";
            _txtTienThuKyNay.Text = "";
            _txtNoKyNay.Text = "";
            _txtMaSach.Text = "";
            try
            {
                _dgwDSSach.Rows.Clear();
            }
            catch
            { }
        }

        //----------------------------------------------------------------------
        //Desc: hiển thị nợ còn lại
        //----------------------------------------------------------------------
        public void HienThiNoConLai()
        {
            if (_ThaoTac == THAOTAC.XEM)
                return;

            double tongno = 0;
            try
            {
                tongno = Double.Parse(_txtTongNo.Text);
            }
            catch
            {
                _txtNoKyNay.Text = "";
            }

            double tienthu = 0;
            try
            {
                tienthu = Double.Parse(_txtTienThuKyNay.Text);
            }
            catch
            {
                _txtNoKyNay.Text = "";
            }

            _txtNoKyNay.Text = (tongno - tienthu).ToString();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button Thoat
        //----------------------------------------------------------------------
        private void _btnThoat_Click(object sender, EventArgs e)
        {
            Close();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button rời textbox MaDG
        //----------------------------------------------------------------------
        private void _txtMaDG_Leave(object sender, EventArgs e)
        {
            if (_ThaoTac != THAOTAC.THEM)
                return;

            if (_txtMaDG.Text != _PhieuTra.DocGia.MaDG || _PhieuTra.DocGia.MaDG == "")
            {
                DTODocGia docgia = _bllDocGia.LayThongTinDG(_txtMaDG.Text);
                if (docgia == null)
                {
                    MessageBox.Show("Mã độc giả không tồn tại");
                    _txtMaDG.Text = _PhieuTra.DocGia.MaDG;
                }
                else
                {
                    _PhieuTra.DocGia = docgia;
                    _txtHoTen.Text = docgia.HoTen;
                    _DSSachDangMuon = _bllPhieuMuon.LayDSSachDangMuon(docgia.MaDG);
                    if (_PhieuTra.DSCTPhieuTra != null)
                        _PhieuTra.DSCTPhieuTra.Clear();
                    try
                    {
                        _dgwDSSach.Rows.Clear();
                    }
                    catch { }
                }
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button Them
        //----------------------------------------------------------------------
        private void _btnThem_Click(object sender, EventArgs e)
        {
            DTOCT_PhieuTra ctptr = LayDuLieuForm();
            if (ctptr != null)
            {
                _PhieuTra.DSCTPhieuTra.Add(ctptr);
                _PhieuTra.TongTienPhat += ctptr.TienPhat;
                _txtTongNo.Text = _PhieuTra.TongTienPhat.ToString();
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button TraSach
        //----------------------------------------------------------------------
        private void _btnTraSach_Click(object sender, EventArgs e)
        {
            if (_PhieuTra.DSCTPhieuTra.Count == 0)
                MessageBox.Show("Chưa nhập mã sách nào");
            else
            {
                double tienthukynay;
                try
                {
                    tienthukynay = Double.Parse(_txtTienThuKyNay.Text);
                }
                catch
                {
                    MessageBox.Show("Nhập sai tiền thu");
                    return;
                }

                if (tienthukynay < 0.0F || tienthukynay > _PhieuTra.TongTienPhat)
                {
                    MessageBox.Show("Tiền thu không được nhỏ hơn 0 hoặc lớn hơn tổng tiền phạt");
                    return;
                }

                _PhieuTra.TienThuKyNay = tienthukynay;
                _PhieuTra.ConLai = _PhieuTra.TongTienPhat - _PhieuTra.TienThuKyNay;
                if (_bllPhieuTra.PhatSinhMaPhieuTra(ref _PhieuTra))
                {
                    if (_bllPhieuTra.CapNhat(_PhieuTra))
                    {
                        int dem = 0;
                        for (int i = 0; i < _PhieuTra.DSCTPhieuTra.Count; i++)
                        {
                            if (_bllCT_PhieuTra.CapNhat(_PhieuTra.DSCTPhieuTra[i]))
                            {
                                _bllCuonSach.CapNhatTinhTrang(_PhieuTra.DSCTPhieuTra[i].CTPhieuMuon.MaCuonSach, true);
                                dem++;
                            }
                        }
                        if (_bllDocGia.CapNhatTongNo(_PhieuTra.DocGia.MaDG, _PhieuTra.DocGia.TongNo + _PhieuTra.ConLai))
                            _PhieuTra.DocGia.TongNo = _PhieuTra.DocGia.TongNo + _PhieuTra.ConLai;

                        MessageBox.Show("Lập phiếu trả sách thành công");
                        _ThaoTac = THAOTAC.SUA;
                        CapNhatGiaoDien();
                    }
                    else
                        MessageBox.Show("Lập phiếu trả thất bại");    
                }
                else
                    MessageBox.Show("Không tạo được mã phiếu trả");
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện form load
        //----------------------------------------------------------------------
        private void GUIPhieuTraSach_Load(object sender, EventArgs e)
        {
            CapNhatGiaoDien();
            CapNhatNoiDung();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện thay đổi tổng nợ
        //----------------------------------------------------------------------
        private void txtTongNo_TextChanged(object sender, EventArgs e)
        {
            HienThiNoConLai();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện thay đổi tiền thu kỳ này
        //----------------------------------------------------------------------
        private void txtTienThuKyNay_TextChanged(object sender, EventArgs e)
        {
            HienThiNoConLai();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button ThemMoi
        //----------------------------------------------------------------------
        private void btnThemMoi_Click(object sender, EventArgs e)
        {
            XoaTatCa();
            _ThaoTac = THAOTAC.THEM;
            CapNhatGiaoDien();
            CapNhatNoiDung();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện trước khi xóa 1 dòng  của data grid view
        //----------------------------------------------------------------------
        private void dgwDSSach_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            switch (_ThaoTac)
            {
                case THAOTAC.THEM:
                    string macuonsach = "";
                    try
                    {
                        macuonsach = (string)e.Row.Cells[0].Value;
                    }
                    catch { macuonsach = null; }

                    if (macuonsach != null && macuonsach != "")
                    {
                        DialogResult result = MessageBox.Show("Bạn có muốn xóa cuốn sách "
                            + macuonsach + " khỏi phiếu trả?", "THÔNG BÁO", MessageBoxButtons.OKCancel);
                        if (result == System.Windows.Forms.DialogResult.OK)
                        {
                            DTOCT_PhieuTra ctptr = null;
                            try
                            {
                                ctptr = _PhieuTra.DSCTPhieuTra[e.Row.Index];
                            }
                            catch { }
                            if (ctptr != null)
                            {
                                _PhieuTra.TongTienPhat -= ctptr.TienPhat;
                                _PhieuTra.DSCTPhieuTra.Remove(ctptr);
                                _txtTongNo.Text = _PhieuTra.TongTienPhat.ToString();
                            }

                        }
                        else
                            e.Cancel = true;
                    }
                    else
                        e.Cancel = true;

                    break;
                default:
                    e.Cancel = true;
                    break;
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện key press
        //----------------------------------------------------------------------
        private void txtNhapSo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e != null)
            {
                if (Utils.CheckKeyCode(e.KeyChar))
                    e.Handled = false;
                else
                    e.Handled = true;
            }
        }
    }
}
